﻿using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace Web.Model
{
	public class Vacancy : Entity
	{
		public Project Project { get; set; }

        [StringLength(100, MinimumLength = 1, ErrorMessage = "Название вакансии должно быть не длиннее 100 символов")]
        [Required(ErrorMessage = "Пожалуйста, укажите название вакансии")]
		public string Name { get; set; }

		string description;

        [Required(ErrorMessage = "Пожалуйста, укажите, что нужно делать")]
        [StringLength(200, MinimumLength = 1, ErrorMessage = "Описание вакансии должно быть не длиннее 200 символов")]
		public string Description 
		{
			get { return description; }
			set { description = NormalizedDescription(value); }
		}

		static string NormalizedDescription(string val)
		{
			return val.Replace("\r\n", " ").Replace("\n", " ");
		}

        [Required(ErrorMessage = "Пожалуйста, укажите, сколько человек вам требуется")]
        [Range(1, int.MaxValue, ErrorMessage = "На вакансию могут записываться 1 и больше человек")]
		public int? NeededNumber { get; set; }

		public int? NeededMore
		{
			get
			{
				if (NeededNumber.HasValue && UsersApproved != null)
					return NeededNumber.Value - UsersApproved.Count;
				else
					return null;
			}
		}

		public bool NeedsMore
		{
			get
			{
				return NeededMore == null || NeededMore.Value > 0;
			}
		}
		
		public bool ApprovalRequired { get; set; }

		public IList<User> UsersApplied { get; set; }

		public IList<User> UsersApproved { get; set; }

	    public void ApproveUser(User user)
	    {
	    	UsersApplied.Remove(user);
            UsersApproved.Add(user);
	    }

	    public void RevokeUser(User user)
	    {
			UsersApproved.Remove(user);
	    }

	    public void Apply(User currentUser)
	    {
            if (ApprovalRequired)
                UsersApplied.Add(currentUser);
            else
                UsersApproved.Add(currentUser);
	    }

	    public void TurnDown(User user)
	    {
			UsersApplied.Remove(user);
	    }

		public bool HasApplied(User user)
		{
			if (UsersApplied.Contains(user)) return true;
			if (UsersApproved.Contains(user)) return true;
			return false;
		}

        public void RemoveAllUsers()
        {
            UsersApplied.Clear();
            UsersApproved.Clear();
        }
	}
}